'''
@Project :my_python_project
@PRODUCT :PyCharm
@File    :os模块.PY
@IDE     :PyCharm
@Author  :xionglinhui
@Date    :2024/9/7 16:55
'''

import os

'''案例1:os.getcwd() 获取当前工作目录'''
print(os.getcwd())  # D:\my_python_project\day22

'''案例2:  os.chdir()改变工作目录'''
# 改变当前工作目录，随后在新目录下创建一个文件夹aaa
os.chdir(r'D:\my_python_project\tests\temp')
os.mkdir('aaa')  # 在D:\my_python_project\tests\temp目录下创建了一个文件夹aaa

'''案例3:os.curdir返回当前目录'''
# 打印当前工作目录
print("当前工作目录:", os.getcwd())  # 当前工作目录: D:\my_python_project\tests\day22
# 切换到当前目录的子目录
os.chdir(os.curdir + r'/a1')
# 再次打印当前工作目录
print("当前工作目录:", os.getcwd())  # 当前工作目录: D:\my_python_project\tests\day22\a1

'''案例4:os.pardir获取当前目录的父目录字符串名('..')'''
# 打印当前工作目录
print("当前工作目录:", os.getcwd())  # D:\my_python_project\tests\day22
# 切换到当前目录的父目录
os.chdir(os.pardir)
# 再次打印当前工作目录
print("当前工作目录:", os.getcwd())  # D:\my_python_project\tests

'''案例5：可生成多层递归目录'''
# 创建一个目录
os.makedirs(r'D:\my_python_project\test\day22\subdirectory')
# 再次创建同一个目录，但设置 exist_ok=True
os.makedirs(r'D:\my_python_project\test\day22\subdirectory', exist_ok=True)

'''案例6：os.removedirs() 若目录为空，则删除，并递归到上一级目录，如若也为空，则删除，依此类推'''
os.removedirs(r'D:\my_python_project\tests\day22\a1\a2\a3')  # 如果a3、a2、a1目录均为空，直接删除a1目录
# 如果a2目录不为空，仅删除a3目录

'''案例7：os.mkdir('dirname') 生成单级目录'''
os.mkdir(r'D:\my_python_project\tests\day22\a1')  # day22下创建a1目录

'''案例8：os.rmdir('dirname') 删除单级空目录，若目录不为空则无法删除，报错'''
os.removedirs(r'D:\my_python_project\tests\day22\a1\a2\a3')  # 仅删除a3目录

'''案例9：os.listdir('dirname') 列出指定目录下的所有文件和子目录，包括隐藏文件，并以列表方式打印'''
# 前置条件：目录为'D:\my_python_project\tests\day22\a1\a2\a3，且a1、a2、a3均为空文件夹
res = os.listdir(r'D:\my_python_project\tests\day22')
print(res, type(res))  # ['a1', 'os模块.py'] <class 'list'>

'''案例10： 删除一个文件，删除1.py'''
os.remove(r'D:\my_python_project\tests\day22\1.py')

'''案例11：os.rename("oldname","newname")  重命名文件/目录'''
os.rename(r'D:\tests\day22\a1', r'D:\tests\day22\a111')  # 将未使用的a1目录名更改为a111名

'''案例12：os.stat('path/filename')  获取文件/目录信息'''
print(os.stat(r'D:\my_python_project\test\os_test.py'))
# 打印：os.stat_result(st_mode=33206, st_ino=5348024557513797, st_dev=4036880606, st_nlink=1, st_uid=0, st_gid=0, st_size=319, st_atime=1725698699, st_mtime=1725698696, st_ctime=1725698407)

'''案例13：os.sep 输出操作系统特定的路径分隔符，win下为"\\",Linux下为"/"'''
print(os.sep)  # \

'''案例14：os.linesep  输出当前平台使用的行终止符，win下为"\t\n",Linux下为"\n"'''
# 打印当前操作系统的换行符
print("当前操作系统的换行符是:", os.linesep)  # windows python10运行无输出结果？why？？
# 写入文件时使用换行符
with open("example.txt", "w") as file:
    file.write("第一行" + os.linesep + "第二行")

'''案例15：os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:'''
print("当前操作系统的路径分隔符是:", os.pathsep)
# 分割路径字符串
paths = "path1" + os.pathsep + "path2" + os.pathsep + "path3"
print("分割后的路径列表:", paths.split(os.pathsep))

'''案例16：os.name  输出字符串指示当前使用平台。win->'nt'; Linux->'posix' '''
# 打印当前操作系统的名称
print("当前操作系统的名称是:", os.name)
# 根据操作系统执行不同的操作
if os.name == 'nt':
    print("这是一个 Windows 系统")
elif os.name == 'posix':
    print("这是一个 Unix 或 Linux 系统")

'''案例17：os.system("bash command")  运行shell命令，直接显示' '''
os.system("ls -l")

'''案例18：os.environ 获取系统环境变量，get()获取某个环境变量，os.environ['xx']设置某个环境变量 ' '''
print(os.environ)
# 获取环境变量的值
home_dir = os.environ.get('HOME')
print("HOME 环境变量的值是:", home_dir)
# 设置环境变量的值
os.environ['MY_VAR'] = 'my_value'
print("MY_VAR 环境变量的值是:", os.environ['MY_VAR'])

'''案例19：os.path.abspath(path)  返回path规范化的绝对路径' '''
# 获取一个相对路径的绝对路径
relative_path = "example.txt"
absolute_path = os.path.abspath(relative_path)
print("相对路径的绝对路径是:", absolute_path)

'''案例20：os.path.split(path)  将path分割成目录和文件名二元组返回'''
path = "/home/user/example.txt"
directory, filename = os.path.split(path)
print("目录是:", directory)  # 打印：/home/user
print("文件名是:", filename)  # 打印：example.txt

'''案例21：os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素'''
# 获取一个文件的目录
path = "/home/user/example.txt"
directory = os.path.dirname(path)
print("文件的目录是:", directory)  # /home/user
# 获取一个目录的父目录
path = "/home/user"
directory = os.path.dirname(path)
print("目录的父目录是:", directory)  # /home

'''案例22：os.path.basename(path) 如果 path 是一个文件名，os.path.basename(path) 会返回该文件名；如果 path 是一个目录名，os.path.basename(path) 会返回该目录的最后一部分。'''
# 获取一个文件的文件名
path = "/home/user/example.txt"
filename = os.path.basename(path)
print("文件的文件名是:", filename)
# 获取一个目录的最后一部分
path = "/home/user"
filename = os.path.basename(path)
print("目录的最后一部分是:", filename)

'''案例23：它用于检查 path 参数指定的文件或目录是否存在。如果 path 存在，os.path.exists(path) 会返回 True；如果 path 不存在，os.path.exists(path) 会返回 False。'''
# 检查一个文件是否存在
path = "/home/user/example.txt"
if os.path.exists(path):
    print("文件存在")
else:
    print("文件不存在")
# 检查一个目录是否存在
path = "/home/user"
if os.path.exists(path):
    print("目录存在")
else:
    print("目录不存在")

'''案例24：os.path.isabs(path)  如果path是绝对路径，返回True'''
# 检查一个路径是否是绝对路径
print("path1 是绝对路径:", os.path.isabs("/home/user/example.txt"))  # True
print("path2 是绝对路径:", os.path.isabs("example.txt"))  # False

'''案例25：os.path.isfile(path)  如果path是一个存在的文件，返回True。否则返回False'''
# 检查一个路径是否是一个存在的文件
path1 = "/home/user/example.txt"
path2 = "/home/user"
print("path1 是一个存在的文件:", os.path.isfile(path1))
print("path2 是一个存在的文件:", os.path.isfile(path2))

'''案例26：如果 path 是一个存在的目录，os.path.isdir(path) 会返回 True；如果 path 不是一个存在的目录，os.path.isdir(path) 会返回 False'''
# 检查一个路径是否是一个存在的目录
path1 = "/home/user"
path2 = "/home/user/example.txt"
print("path1 是一个存在的目录:", os.path.isdir(path1))
print("path2 是一个存在的目录:", os.path.isdir(path2))

'''案例27：os.path.join(path1[, path2[, ...]])，它用于将多个路径组合成一个完整的路径。os.path.join() 函数会根据操作系统的规则来处理路径分隔符'''
# 组合多个路径
path = os.path.join("/home", "user", "example.txt")
print("组合后的路径是:", path)

'''案例28：它用于返回 path 参数所指向的文件或目录的最后访问时间。返回值是一个浮点数，表示从纪元（1970年1月1日00:00:00）到指定时间的秒数。'''
# 获取一个文件的最后访问时间
print(os.path.getatime(r'D:\my_python_project\tests\day20\xx.py'))
# 获取一个文件夹的最后访问时间
print(os.path.getatime(r'D:\my_python_project\tests\day20'))

'''案例29：它用于返回 path 参数所指向的文件或目录的最后修改时间。返回值是一个浮点数，表示从纪元（1970年1月1日00:00:00）到指定时间的秒数。'''
os.path.getmtime(r'/home/user/example.txt')
os.path.getmtime(r'/home/user')

'''案例30：os.path.getsize(path) 只能获取文件的大小 '''
print(os.path.getsize(r"/home/user/temp.txt"))

